Pustaka pandas digunakan untuk membaca dan menganalisa data dalam berbagai format. Secara umum fungsi-fungsi pada pandas mirip dengan Microsoft Excel.
Informasi lengkap mengenai pandas dapat dilihat di https://pandas.pydata.org/.
import pandas as pd
df = pd.read_csv("../datasets/titanic_numerical_features.csv", index_col="PassengerId")
df.head()
| Survived | Pclass | Age | SibSp | Parch | Fare | |
|---|---|---|---|---|---|---|
| PassengerId | ||||||
| 1 | 0 | 3 | 22.0 | 1 | 0 | 7.2500 |
| 2 | 1 | 1 | 38.0 | 1 | 0 | 71.2833 |
| 3 | 1 | 3 | 26.0 | 0 | 0 | 7.9250 |
| 4 | 1 | 1 | 35.0 | 1 | 0 | 53.1000 |
| 5 | 0 | 3 | 35.0 | 0 | 0 | 8.0500 |
Untuk mengakses informasi pada DataFrame seperti jumlah baris, jumlah kolom, tipe data kolom, ukuran memori, dan lain-lain dapat menggunakan perintah DataFrame.info().
df.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 891 entries, 1 to 891 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Survived 891 non-null int64 1 Pclass 891 non-null int64 2 Age 714 non-null float64 3 SibSp 891 non-null int64 4 Parch 891 non-null int64 5 Fare 891 non-null float64 dtypes: float64(2), int64(4) memory usage: 48.7 KB
Salah satu produk turunan dari pandas adalah pandas-profiling. Pustaka pandas-profiling menyediakan fungsi untuk melakukan EDA (Exploratory Data and Analysis) dengan cepat. Menampilkan overview, variables, interactions, correlations, missing value, dan samples dalam bentuk laporan berformat .html.
Informasi mengenai pandas-profiling dapat dilihat di https://pandas-profiling.ydata.ai/docs/master/index.html.
from pandas_profiling import ProfileReport
profile = ProfileReport(df, title="Pandas Profiling Report")
profile
Summarize dataset: 0%| | 0/5 [00:00<?, ?it/s]
Generate report structure: 0%| | 0/1 [00:00<?, ?it/s]
Render HTML: 0%| | 0/1 [00:00<?, ?it/s]
Tahapan drop missing value sangat penting dilakukan agar fitur yang digunakan pada saat training tidak ada yang kosong. Tahapan ini perlu pertimbangan yang memadai, karena bisa saja menghilangkan suatu fitur dapat mengurangi informasi dari dataset yag dapat mempengaruhi performa dari model.
df.isna().sum()
Survived 0 Pclass 0 Age 177 SibSp 0 Parch 0 Fare 0 dtype: int64
df = df.dropna()
df.isna().sum()
Survived 0 Pclass 0 Age 0 SibSp 0 Parch 0 Fare 0 dtype: int64
Pemisahan dataset menjadi train dan test set dilakukan untuk mengurangi data leakage atau kebocoran informasi. Model tidak boleh mengetahui pola dari test set. Untuk melakukan pemisahan dataset dapat menggunakan pustaka scikit-learn, yaitu fungsi train_test_split.
from sklearn.model_selection import train_test_split
X = df.drop(columns="Survived")
y = df.Survived
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
print(f"X_train shape, rows: {X_train.shape[0]}, columns: {X_train.shape[1]}")
print(f"X_train shape, rows: {y_train.shape[0]}")
print(f"X_test shape, rows: {X_test.shape[0]}, columns: {X_test.shape[1]}")
print(f"y_test shape, rows: {y_test.shape[0]}")
X_train shape, rows: 571, columns: 5 X_train shape, rows: 571 X_test shape, rows: 143, columns: 5 y_test shape, rows: 143
Untuk membuat model machine learning dapat menggunakan pustaka scikit-learn dan mengimpor algoritma yang inginkan. scikit-learn menyediakan berbagai fungsionalitas dan algoritma terkait machine learning.
Untuk lebih lengkapnya, terkait fungsi dan algoritma yang disediakan scikit-learn dapat mengunjungi https://scikit-learn.org/stable/modules/classes.html#.
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=3, n_jobs=-1)
model.fit(X_train, y_train)
KNeighborsClassifier(n_jobs=-1, n_neighbors=3)
Evaluasi dilakukan untuk meninjau performa dari model. Biasanya menggunakan akurasi pada kasus klasifikasi. Pengujian dapat dilakukan dengan menggunakan train dan test dataset. Tetapi, pengujian dengan test dataset menjadi acuan utama dalam meninjau performa model.
Untuk lebih lengkapnya dapat mengunjungi halaman berikut https://scikit-learn.org/stable/modules/classes.html#sklearn-metrics-metrics.
print(f"Train accuracy : {model.score(X_train, y_train)}")
print(f"Test accuracy : {model.score(X_test, y_test)}")
Train accuracy : 0.7898423817863398 Test accuracy : 0.6783216783216783
Setelah melakukan training dan evaluasi terhadap model, model dapat digunakan untuk melakukan prediksi menggunakan data baru.
df_new = pd.DataFrame(
data=[[1, 34., 2, 7, 300.],
[3, 50., 0, 0, 7.34]],
columns=X_train.columns,
index=[892, 893]
)
train_preds = model.predict(df_new)
df_new["Survived Predicition"] = train_preds
df_new
| Pclass | Age | SibSp | Parch | Fare | Survived Predicition | |
|---|---|---|---|---|---|---|
| 892 | 1 | 34.0 | 2 | 7 | 300.00 | 1 |
| 893 | 3 | 50.0 | 0 | 0 | 7.34 | 0 |
Setelah training dan evaluasi model, model dapat disimpan dengan menggunakan pustaka joblib. Fungsi dump untuk menyimpan objek model dan load untuk menggunakan objek yang telah disimpan sebelumnya.
from joblib import dump, load
dump(model, "../pretrained_models/model.joblib")
model = load("../pretrained_models/model.joblib")
model.predict(df_new.iloc[:, 0:5])
array([1, 0], dtype=int64)